const axios = require('axios')
const { getFriendList } = require('./method')
const { uniFriendUrl } = require('./enum')
let addNum = 0
const id = 1180418
const title = '迪丽热巴'

async function add(lemmaId, lemmaTitle, coverPic) {
    /**
     * 1.查询数据库中是否已存在该明星数据
     * */
    let friendListRes = await axios({
        method: 'post',
        data: {
            lemmaId,
        },
        url: uniFriendUrl.get,
    })
    const friendList = friendListRes.data.data[0]?.friends || []
    const _id = friendListRes.data.data[0]?._id
    if (!_id) {
        /**
         * 2.若不存在，则从百度百科获取该明星数据
         * */
        const { success, friends } = await getFriendList(lemmaId, lemmaTitle)
        if (success) {
            const params = {
                lemmaId,
                lemmaTitle,
                coverPic,
                friends,
            }
            let res = await axios({
                method: 'POST',
                data: params,
                url: uniFriendUrl.add,
            })
            /**
             * 3.获取该明星数据成功，并成功添加到数据库后，执行下一个添加任务
             * */
            if (res.data.id) {
                addNum++
                console.log(`${lemmaTitle}-${lemmaId}添加成功`)
                return Promise.resolve({
                    success: 1,
                    _id: res.data.id,
                    friends,
                })
            }
        } else {
            console.log(`${lemmaTitle}-${lemmaId}好友信息获取失败`)
            return Promise.resolve({ success: 3 })
        }
    } else {
        /**
         * 4.数据库中已存在该明星数据，从中其friends列表中，依次判断是否从百度百科中获取数据并添加
         * */

        return Promise.resolve({
            success: 2,
            _id,
            friends: friendList,
        })
    }
}

async function main(friends, _id) {
    try {
        if (friends.length) {
            for (let i = 0; i < friends.length; i++) {
                let item = friends[i]
                if (
                    item.relationName !== '好友' ||
                    item.used ||
                    !/^[\w]{1,3}$/.test(item.lemmaTitle) ||
                    isJapaneseName(item.lemmaTitle)
                ) {
                    console.log('跳过', i, item.lemmaTitle)
                    if (i === friends.length - 1) {
                        if (_id) {
                            const updateRes = await axios({
                                method: 'POST',
                                data: {
                                    _id,
                                    used: true, //标记该人员下的所有好友已存在于数据库
                                },
                                url: uniFriendUrl.update,
                            }).catch((e) => e.response)
                            start()
                        }
                        console.log(`${_id}-好友信息全部获取完成`)
                        console.log('本次添加总条数：', addNum)
                    }
                    continue
                }
                console.log('未跳过', i, item.lemmaTitle)
                /**
                 * 5.item.used不为true，代表未使用该数据进行添加
                 * */
                const addRes = await add(item.lemmaId, item.lemmaTitle, item.coverPic)
                /**
                 * 添加结果为1，代表添加成功，将其状态改为used:true
                 * 添加结果为2，代表该数据在他人好友关系中，己被添加到数据库，故也将其状态改为used:true，同时会返回其好友列表和其在数据库中的id供下一次添加
                 */
                if (addRes.success == 1 || addRes.success == 2) {
                    item.used = true
                    if (_id) {
                        const updateRes = await axios({
                            method: 'POST',
                            data: {
                                _id,
                                friends,
                            },
                            url: uniFriendUrl.update,
                        }).catch((e) => e.response)
                    }

                    await main(addRes.friends, addRes._id)
                    break
                }
            }
        } else {
            start()
        }
    } catch (e) {
        console.log(e)
    }
}

async function start(init = false) {
    if (init) {
        return main([{ lemmaId: id, lemmaTitle: title, relationName: '好友' }])
    }
    let friendListRes = await axios({
        method: 'post',
        data: {
            used: null,
            friends: {
                $ne: [],
            },
        },
        url: uniFriendUrl.get,
    })
    friendListRes = friendListRes.data.data[0]
    if (friendListRes?.friends?.length > 0) {
        main(friendListRes.friends, friendListRes._id)
    } else {
        console.log('数据库中未查询到used为null的数据')
    }
}
//第一次，以迪丽热巴为root节点，获取数据1447条，lemmaId:7212171lemmaTitle:小笠原茉由结束
//第二次，以郑少秋开头
start(false)

function isJapaneseName(name) {
    // 匹配常见的日本姓氏
    const commonJapaneseSurnames = [
        '佐藤',
        '鈴木',
        '高橋',
        '田中',
        '伊藤',
        '山本',
        '渡辺',
        '中村',
        '小林',
        '神乐',
        '太郎',
        '次郎',
        '三郎',
        '花子',
        '美香',
        '明子',
        '由美',
        '真理子',
        '金喜',
    ]

    let result = false
    for (let i = 0; i < commonJapaneseSurnames.length; i++) {
        let item = commonJapaneseSurnames[i]
        if (name.indexOf(item) > -1) {
            result = true
            break
        }
    }
    return result
}
